home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / alpha.arc / LAPBTIME.C < prev    next >
C/C++ Source or Header  |  1988-07-24  |  3KB  |  135 lines

  1. #include "global.h"
  2. #include "mbuf.h"
  3. #include "ax25.h"
  4. #include "timer.h"
  5. #include "lapb.h"
  6.  
  7. /* Called whenever timer T1 expires */
  8. void
  9. recover(n)
  10. int *n;
  11. {
  12.     register struct ax25_cb *axp;
  13.     void lapbstate();
  14.  
  15.     axp = (struct ax25_cb *)n;
  16.  
  17.     switch(axp->state){
  18.     case SETUP:
  19.         if(axp->n2 != 0 && axp->retries == axp->n2){
  20.             free_q(&axp->txq);
  21.             lapbstate(axp,DISCONNECTED);
  22.         } else {
  23.             axp->retries++;
  24.             sendctl(axp,COMMAND,SABM|PF);
  25.             start_timer(&axp->t1);
  26.         }
  27.         break;
  28.     case DISCPENDING:
  29.         if(axp->n2 != 0 && axp->retries == axp->n2){
  30.             lapbstate(axp,DISCONNECTED);
  31.         } else {
  32.             axp->retries++;
  33.             sendctl(axp,COMMAND,DISC|PF);
  34.             start_timer(&axp->t1);
  35.         }
  36.         break;
  37.     case CONNECTED:
  38.         axp->retries = 0;
  39.     case RECOVERY:    /* note fall-thru */
  40.         if(axp->n2 != 0 && axp->retries == axp->n2){
  41.             /* Give up */
  42.             sendctl(axp,RESPONSE,DM|PF);
  43.             free_q(&axp->txq);
  44.             lapbstate(axp,DISCONNECTED);
  45.         } else {
  46.             /* Transmit poll */
  47.             tx_enq(axp);
  48.             axp->retries++;
  49.             lapbstate(axp,RECOVERY);
  50.         }
  51.         break;
  52.     case FRAMEREJECT:
  53.         if(axp->n2 != 0 && axp->retries == axp->n2){
  54.             sendctl(axp,RESPONSE,DM|PF);
  55.             free_q(&axp->txq);
  56.             lapbstate(axp,DISCONNECTED);
  57.         } else {
  58.             frmr(axp,0,0);    /* Retransmit last FRMR */
  59.             start_timer(&axp->t1);
  60.             axp->retries++;
  61.         }
  62.         break;
  63.     }
  64.     /* Empty the trash */
  65.     if(axp->state == DISCONNECTED)
  66.         del_ax25(axp);
  67. }
  68.  
  69. /* T2 has expired, we can't delay an acknowledgement any further */
  70. void
  71. send_ack(n)
  72. int *n;
  73. {
  74.     char control;
  75.     register struct ax25_cb *axp;
  76.  
  77.     axp = (struct ax25_cb *)n;
  78.     switch(axp->state){
  79.     case CONNECTED:
  80.     case RECOVERY:
  81.         control = len_mbuf(axp->rxq) > axp->window ? RNR : RR;
  82.         sendctl(axp,RESPONSE,control);
  83.         axp->response = 0;
  84.         break;
  85.     }
  86. }
  87.  
  88. /* Send a poll (S-frame command with the poll bit set) */
  89. void
  90. pollthem(n)
  91. int *n;
  92. {
  93.     register struct ax25_cb *axp;
  94.  
  95.     axp = (struct ax25_cb *)n;
  96.     if(axp->proto == V1)
  97.         return;    /* Not supported in the old protocol */
  98.     switch(axp->state){
  99.     case CONNECTED:
  100.         axp->retries = 0;
  101.         tx_enq(axp);
  102.         lapbstate(axp,RECOVERY);
  103.         break;
  104.     }
  105. }
  106. /* Transmit query */
  107. tx_enq(axp)
  108. register struct ax25_cb *axp;
  109. {
  110.     char ctl;
  111.     struct mbuf *bp;
  112.  
  113.     /* I believe that retransmitting the oldest unacked
  114.      * I-frame tends to give better performance than polling,
  115.      * as long as the frame isn't too "large", because
  116.      * chances are that the I frame got lost anyway.
  117.      * This is an option in LAPB, but not in the official AX.25.
  118.      */
  119.     if(axp->txq != NULLBUF && len_mbuf(axp->txq) < axp->pthresh
  120.      && (axp->proto == V1 || !axp->remotebusy)){
  121.         /* Retransmit oldest unacked I-frame */
  122.         dup_p(&bp,axp->txq,0,len_mbuf(axp->txq));
  123.         ctl = PF | I | ((axp->vs - axp->unack) & MMASK) << 1
  124.          | axp->vr << 5;
  125.         sendframe(axp,COMMAND,ctl,bp);
  126.     } else {
  127.         ctl = len_mbuf(axp->rxq) >= axp->window ? RNR|PF : RR|PF;    
  128.         sendctl(axp,COMMAND,ctl);
  129.     }
  130.     axp->response = 0;    
  131.     stop_timer(&axp->t3);
  132.     start_timer(&axp->t1);
  133. }
  134.  
  135.